///////////////////////////////
// Analizador sintáctico
///////////////////////////////


parser grammar AnalizadorParser;

options {
  tokenVocab = AnalizadorLexer;
  //ASTLabelType = CommonTree;
  ASTLabelType = MiArbol;
  output = AST;
  backtrack = true;
}

tokens {
  INSTRS;
  FUNC;
  CALL;
  UNARIO;
}

@header {
  package practpl.doce;
  import java.util.Hashtable;
}

@members {
  public List<CommonTree> functionDefinitions = new ArrayList<CommonTree>();
}

@rulecatch {

}

instrucciones
  : (tipoentrada SEPARADOR)* EOF -> ^(INSTRS tipoentrada*)
  ;

tipoentrada
  : asignacion
  | expresion
  | funcion 
  ;

asignacion
  : IDENT IGUAL^ expresion
  ;

funcion
  : IDENT PARENTA parametro PARENTC IGUAL expresion -> ^(FUNC IDENT parametro expresion)
  ;
  finally {
    functionDefinitions.add($funcion.tree);
  }

numero
  : ENTERO
  | REAL
  ;
  
parametro
  : IDENT
  | ENTERO
  | REAL
  ;

expresion
  : exp_mult ((MAS^|MENOS^) exp_mult)*
  ;

exp_mult 
  : exp_base ((MULT^|DIV^) exp_base)*
  ;

exp_base 
  : MENOS^ numero
  | parametro
  | PARENTA! expresion PARENTC!
  | CORCHETEA expresion CORCHETEC -> ^(UNARIO expresion) 
  | IDENT PARENTA parametro PARENTC -> ^(CALL IDENT parametro)
  ;
